package common;


import java.util.*;
import java.io.*;
import java.text.*;

/**
 * 공통적으로 사용되는 메소드들을 모아놓은 클래스.
 * @author (주)열음소프트
 * @version 1.0
 */
public class CommonUtil {

	static private Random rd;
    public static String toEng(String ko)
    {
      if (ko== null){
          return "";
      }
      try {
         return new String(ko.getBytes("KSC5601"),"8859_1");
      }
      catch (Exception e) {
         return ko;
      }

    }

    public static String toKor(String en)
    {
      if (en== null){
          return "";
      }
      try {
         return new String(en.getBytes("8859_1"),"KSC5601");
      }
      catch (Exception e) {
         return en;
      }

    }
    
    public static String toUTF8(String en)
    {
      if (en== null){
          return "";
      }
      try {
         return new String(en.getBytes("8859_1"),"UTF-8");
      }
      catch (Exception e) {
         return en;
      }

    }
    
    public static String nvl(String s, String s1){
		if(s == null )
			return s1;
		else
			return s.trim();
	}

	public static String nvl(String s){
		if(s == null )
			return "";
		else
			return s.trim();
	}

	/******************************************************************************
	 1. 메소드    이름 : setMoneyFormat
	 2. 설          명 : DB 포맷에 맞게 값을 변경
	*******************************************************************************/
		public static String setMoneyFormat(String str)
	  	{
	  		String ret = null;

	    	if ( (str.equals("")) || (str == null))
	    	{
	    		return "";
			}
			else
			{
	    		try
	    		{
	      			Double d = Double.valueOf(str.toString().trim());
	      			double m = d.doubleValue();
	        		ret = Double.toString(m);

	        		DecimalFormat df1 = new DecimalFormat("#,###");
	        		ret = df1.format(m).toString();
	    		}
	    		catch(Exception e)
	    		{
	      			System.out.println("setMoneyFormat error : "+e);
	    		}
			}
	    	return ret;
	  	}
	/******************************************************************************
	 1. 메소드    이름 : setNumber
	 2. 설          명 : 숫자의 포맷을 변경
	*******************************************************************************/
		public static String setNumber(String stNumber) throws Exception
		{

			try
			{
				if(stNumber.equals("") || stNumber == null){
					return "";
				}

				NumberFormat nf1 = NumberFormat.getInstance();
				return(nf1.format(Integer.parseInt(stNumber)));
			}
			catch( Exception e )
			{
				throw new Exception("공통함수에서 숫자의 포멧을 변경하던중에 에러가 발생하였습니다.");
			}
		}

	/******************************************************************************
	 1. 메소드    이름 : setToday
	 2. 설          명 : 현재 년,월,날짜를 지정된 형태로 변환한다
	 3. 입          력 : 날짜 형태

	                     아래 코드는 SimpleDateFormat 메소드 api 에서 가져온것입니다.
	                     입맛에 맞는 것을 골라서 아래 의 dataFormat변수에 넣어주면 되겠지요
	                     
	                     Format Pattern Result
	                     -------------- -------
	                     "yyyy.MM.dd G 'at' hh:mm:ss z" ->> 1996.07.10 AD at 15:08:56 PDT
	                     "EEE, MMM d, ''yy" ->> Wed, July 10, '96
	                     "h:mm a" ->> 12:08 PM
	                     "hh 'o''clock' a, zzzz" ->> 12 o'clock PM, Pacific Daylight Time
	                     "K:mm a, z" ->> 0:00 PM, PST
	                     "yyyyy.MMMMM.dd GGG hh:mm aaa" ->> 1996.July.10 AD 12:08 PM

	 4. 출          력 : 현재 년,월, 날짜
	*******************************************************************************/
	public static String setToday(String stFormat)
	{
		try
		{
			SimpleDateFormat sdf = new SimpleDateFormat(stFormat);
			Calendar cToday = Calendar.getInstance(TimeZone.getTimeZone("KST"));

			return(sdf.format(cToday.getTime()));
		}
		catch( Exception e )
		{
			return null;
		}
	}

	/******************************************************************************
	 1. 메소드    이름 : setToday
	 2. 설          명 : 현재 년,월,날짜를 지정된 형태로 변환한다
	 3. 입          력 : 날짜 형태, 변환 기호(1 = 년도 2 = 월 3 = 일), 변환 기간

	                     아래 코드는 SimpleDateFormat 메소드 api 에서 가져온것입니다.
	                     입맛에 맞는 것을 골라서 아래 의 dataFormat변수에 넣어주면 되겠지요
	                     
	                     Format Pattern Result
	                     -------------- -------
	                     "yyyy.MM.dd G 'at' hh:mm:ss z" ->> 1996.07.10 AD at 15:08:56 PDT
	                     "EEE, MMM d, ''yy" ->> Wed, July 10, '96
	                     "h:mm a" ->> 12:08 PM
	                     "hh 'o''clock' a, zzzz" ->> 12 o'clock PM, Pacific Daylight Time
	                     "K:mm a, z" ->> 0:00 PM, PST
	                     "yyyyy.MMMMM.dd GGG hh:mm aaa" ->> 1996.July.10 AD 12:08 PM
	                                                              

	 4. 출          력 : 현재 년,월, 날짜
	*******************************************************************************/
	public static String setToday(String stFormat, String stAddDate, int inAddDateTy)
	{

		try
		{
			SimpleDateFormat sdf = new SimpleDateFormat(stFormat);
			Calendar cToday = Calendar.getInstance(TimeZone.getTimeZone("KST"));
			int inAddty = inAddDateTy;
			if ( inAddty == 1 ) {
				cToday.add(Calendar.YEAR, Integer.parseInt(stAddDate));  // 년도 변환
			} else if ( inAddty == 2 ) {
				cToday.add(Calendar.MONTH, Integer.parseInt(stAddDate)); // 월 변환
			} else if ( inAddty == 3 ) {
				cToday.add(Calendar.DATE, Integer.parseInt(stAddDate)); // 일 변환
			} else if ( inAddty == 5 ) {
				cToday.add(Calendar.MINUTE, Integer.parseInt(stAddDate)); // 분 변환
			}

			return(sdf.format(cToday.getTime()));
		}
		catch( Exception e )
		{
			return null;
		}
	}

	/******************************************************************************
	 1. 메소드    이름 : getToday
	 2. 설          명 : 지정된 형태로 변환된 년/월/날짜를 리턴한다.
	 3. 입          력 :
	 4. 출          력 : 현재 년,월, 날짜
	 5. 호  출  함  수 : setToday(stDateFormat)
	*******************************************************************************/
	public static String getToday(String stFormated)
	{
		String stDateFormat = stFormated;		// 리턴하는 년,월,날짜의 형태를 저장
		String stDateFormatReturn;

		stDateFormatReturn = setToday(stDateFormat);

		return stDateFormatReturn;
	}

	/******************************************************************************
	 1. 메소드    이름 : getToday
	 2. 설          명 : 지정된 형태와 기간으로 변환된 년/월/날짜를 리턴한다.
	 3. 입          력 :
	 4. 출          력 : 현재 년,월, 날짜
	 5. 호  출  함  수 : setToday(stDateFormat,addDate,addDateTy)
	*******************************************************************************/
	public static String getToday(String stFormated,String stAddCount,int inAddty)
	{
		String stDateFormat = stFormated;		// 리턴하는 년,월,날짜의 형태를 저장
		String stDateFormatReturn;
		String addDate = stAddCount;
		int addDateTy = inAddty;

		stDateFormatReturn = setToday(stDateFormat,addDate,addDateTy);

		return stDateFormatReturn;
	}

	/******************************************************************************
	 1. 메소드    이름 : getDates
	 2. 설          명 : 인자로 들어온 날짜에서 '/' 기호를 제거한후 반환한다.
	 3. 입          력 : 년월일 ( xxxx/xx/xx )
	 4. 출          력 : 변환된 년월일 ( xxxxxxxxxx)
	*******************************************************************************/
	public static String getDates(String stDate)
	{
		try {
			if (stDate != null && !stDate.equals("")) {
				return stDate.substring(0,4) + stDate.substring(5,7) + stDate.substring(8,10);
	  		} else { return null;}
		}catch( Exception e )
		{
				return null;
		}
	}

	/******************************************************************************
	 1. 메소드    이름 : getAddDate
	 2. 설          명 : 지정된 년,월,날짜를 지정된 형태, 지정된 기간을 변환하여 보여준다.
	 3. 입          력 : 날짜 형태, 시작년월일, 변환기간,  변환 기호(1 = 년도 2 = 월 3 = 일)
	 4. 출          력 : 변환기간을 지정된 형태로 변환
	*******************************************************************************/
	public static String getAddDate(String stFormat,String stDate, String stAddDate, int inAddDateTy)
	{
		try
		{

			SimpleDateFormat sdf = new SimpleDateFormat(stFormat);

			int iYear  =Integer.parseInt(stDate.substring(0,4));
			int iMonth = Integer.parseInt(stDate.substring(4,6)) - 1;  // Calendar의 set 메쏘드에서 달은 0 이 기본이다. 즉 1월은 0 ....
			int iDate = Integer.parseInt(stDate.substring(6,8));
			Calendar cToday = Calendar.getInstance(TimeZone.getTimeZone("KST"));

			cToday.set(iYear,iMonth,iDate);

			int inAddty = inAddDateTy;

			if ( inAddty == 1 ) {
				cToday.add(Calendar.YEAR, Integer.parseInt(stAddDate));  // 년도 변환
			} else if ( inAddty == 2 ) {
				cToday.add(Calendar.MONTH, Integer.parseInt(stAddDate)); // 월 변환
			} else if ( inAddty == 3 ) {
				cToday.add(Calendar.DATE, Integer.parseInt(stAddDate)); // 일 변환
			}

			return(sdf.format(cToday.getTime()));
		}catch( Exception e )
		{
			return null;
		}
	}


	/******************************************************************************
	 1. 메소드    이름 : setDates
	 2. 설          명 : 인자로 들어온 숫자에서 '/' 기호를 덧붙인후 반환한다.
	 3. 입          력 : 년월일 ( xxxxxxxx )
	 4. 출          력 : 변환된 년월일 ( xxxx/xx/xx)
	*******************************************************************************/
	public static String setDates(String stDate)
	{
		try
		{

	 		if (stDate != null && !stDate.equals("")) {
				return stDate.substring(0,4) + "/" + stDate.substring(4,6) +"/"+ stDate.substring(6,8);
	  		} else { return "";}

		}catch( Exception e )
		{
			return null;
		}
	}

	/******************************************************************************
	 1. 메소드    이름 : getMonth
	 2. 설          명 : 인자로 들어온 날짜에서 '/' 기호를 제거한후 반환한다.
	 3. 입          력 : 년월 ( xxxx/xx )
	 4. 출          력 : 변환된 년월일 ( xxxxxxxx)
	*******************************************************************************/
	public static String getMonth(String stDate)
	{
		try
		{

	 		if (stDate != null && !stDate.equals("")) {
				return stDate.substring(0,4) + stDate.substring(5,7);
			} else { return null;}

		}catch( Exception e )
		{
			return null;
		}
	}
		
	 public static boolean checkModify(String stCheckDate)
	 {
		try
		{

			if (Integer.parseInt(getToday("dd")) > 10 ) 
			{
				if(Integer.parseInt(stCheckDate) < Integer.parseInt(getToday("yyyyMM10"))) 
					return false;
				else
					return true;					
			} else 
			{
				if(Integer.parseInt(stCheckDate) < Integer.parseInt(getToday("yyyyMM10","-1",2))) 
					return false;
				else
					return true;			
			}
		} 	
		catch(Exception e)
		{
			return false;		
		}
	 }

	/******************************************************************************
	 1. 메소드    이름 : getBytesString
	 2. 설          명 : 입력되어진 문자를 바이트로 계산을 해서 원하는 만큼의 문자로 서브스트링
	                     하여 문자를 리턴한다
	 3. 입          력 : source_string ->문자열, byte_length :문자열의 바이트 length
	*******************************************************************************/
	 public static String getByte_String(String source_string, int byte_length)
	 {
		String temp_string = "";

	      //제목 바이트로 서브스트링 하기위해서
	      if ( source_string.getBytes().length > byte_length )
	      {
	      	for( int j=0; j < source_string.length() ; j++)
	      	{
	      		temp_string = source_string.substring(0,j+1);
	      		if( temp_string.getBytes().length > byte_length)
	      			break;
	      	}
	      	temp_string = temp_string +"...";
	      }else
	      {
	      	temp_string = source_string;
	      }					

		return temp_string;    
		  
	}

	/******************************************************************************
	 1. 메소드    이름 : getPageNumber
	 2. 설          명 : List 출력시 페이지별 인덱스를 걸어주고 그 문장 자체를 반환한다.
	 3. 입          력 : int inCurPage  -  현재 페이지
							int inTotPage  -  총 페이지 수
							String stUrl   -   list 를 출력할 JSP 페이지
							String stParamValue  -  list 를 출력할 JSP로 GET 방식으로 넘겨줄 파라메터의 집합
							(ex..  &acpt_ty=2&s_pblno=0011110011&e_pblno=0022220011)

	 4. 출          력 : String
	*******************************************************************************/
	public static String getPageNumber(int inCurPage, int inTotPage, String stUrl, String stParamValue)
	{
		int inTotIndex;				//	10개 페이지를 하나의 큰 단위로 묶었을 때, 그 묶음의 갯수를 나타내는 변수
		int inCurIndex;				//	현재 페이지가 위 묶음 중 몇 번째 묶음에 속하는 지 나타내주는 변수
		int inPageIndex;			//  45 Line 참조
		int inTempPage;				//  묶음간의 페이지 이동시..이용되는 임시 변수..

		String stIndexResult = "";	//	반환할 페이지 인덱스 결과(문장)
		String stIndexResult2 = "";
		String stIndexResult3 = "";

		if (stParamValue == null)   stParamValue = "";

		inTotIndex = (inTotPage - 1) / 10 + 1;
		inCurIndex = (inCurPage - 1) / 10 + 1;

		for(int i = 1; i <= 10; i++)						// 현재 페이지가 속한 묶음을 기준으로 인덱스를 생성한다.
		{
			inPageIndex = (inCurIndex - 1) * 10 + i;		// 만약 두 번째 묶음이라면 11부터 20까지 인덱스를 만들게 된다.

			if (inPageIndex <= inTotPage)		//  인덱싱 중인 페이지가 마지막 페이지(총페이지)를 넘지 않았을 경우에만 작업을 진행한다.
			{
				if (inPageIndex == inCurPage)	//  현재 페이지엔 링크를 걸지 않고 강조표시를 해준다.
				{
					stIndexResult = stIndexResult + "[<B>" + inPageIndex + "</B>] ";
				}else
				{								// 그 외의 페이지엔 이동이 가능하도록 링크를 건다.
					stIndexResult = stIndexResult + "[<A HREF='" + stUrl + "?pages=" + inPageIndex + stParamValue + "'>" + inPageIndex + "</A>] ";
				}

				if (i == 1)						// 현재 페이지가 임의의 묶음의 첫번째 페이지라면...
				{
												// ◀ ... 표시를 눌렀을 경우,  현재 묶음의 바로 전 묶음의 마지막 페이지로 이동하도록 링크를 건다.
					inTempPage = inPageIndex - 1;
					stIndexResult2 = "<A HREF='" + stUrl + "?pages=" + inTempPage + stParamValue + "'>◀</A> ";

												// 1 을 누르면 검색된 페이지 중에서 첫 번째 페이지로 이동한다.
					stIndexResult3 = "<A HREF='" + stUrl + "?pages=1" + stParamValue + "'>◀◀</A> ";

					if (inCurIndex == 1)		// 현재 페이지가 첫번째 묶음에 속한다면....
					{
						stIndexResult = stIndexResult+"";		// 왼쪽에 ◀ ... 표시를 넣지 않는다.
					 }else
					{										//  두 번째 이상의 묶음이라면..  ◀ 표시를 추가해준다.
						 stIndexResult = stIndexResult3 + stIndexResult2 + stIndexResult;
					}
				}else if (i == 10)							// 현재 페이지가 임의의 묶음의 마지막 페이지라면...
				{
					inTempPage = inPageIndex + 1;
					stIndexResult2 = "<A HREF='" + stUrl + "?pages=" + inTempPage + stParamValue + "'>▶</A>";
					stIndexResult3 = " <A HREF='" + stUrl + "?pages=" + inTotPage + stParamValue + "'>▶▶</A>";

					if (inCurIndex == inTotIndex)			// 마찬가지로... 현재페이지가 마지막 묶음에 속한다면...
					{
						stIndexResult = stIndexResult+"";		// 오른쪽에 ... ▶ 표시를 넣지 않는다.
					}else
					{										// 마지막 묶음이 아니라면  ... ▶ 표시를 추가한다.
						stIndexResult = stIndexResult + stIndexResult2 + stIndexResult3;
					}
				}
			}
		}
		return stIndexResult;		// 완성된 페이지 인덱스를 return 한다.
	}
	/******************************************************************************
	 1. 메소드    이름 : Rename()
	 2. 설          명 : upload 파일 이름 바꾸기
	*******************************************************************************/
	   public static void Rename(String file_s, String file_n)
	   {
			File foo1 = new File (file_s);
			File foo2 = new File (file_n);
			foo1.renameTo(foo2);// 화일의 이름을 바꾼다.
	   }
	   	   
	   public static String get1MonAddDate(String sTocken){
			int iMonth; 
			int iDay;
			int iPos=0;
			DecimalFormat dft = new DecimalFormat("00");
			String s1MonaddDate = "";
			GregorianCalendar date1 = new GregorianCalendar();

			if (sTocken.indexOf("Y")>0||sTocken.indexOf("M")>0||sTocken.indexOf("D")>0) {
				if (sTocken.indexOf("Y")>0){
					iPos = sTocken.indexOf("Y");
					date1.add(Calendar.YEAR,Integer.parseInt(sTocken.substring(iPos+1)));	//입력된 연도뒤의 날자
				}else if	(sTocken.indexOf("M")>0){
					iPos = sTocken.indexOf("M");
					date1.add(Calendar.MONTH,Integer.parseInt(sTocken.substring(iPos+1)));	//입력된 월뒤의 날자
				}else if	(sTocken.indexOf("D")>0){
					iPos = sTocken.indexOf("D");
					date1.add(Calendar.DATE,Integer.parseInt(sTocken.substring(iPos+1)));	//입력된 월뒤의 날자
				}		
				sTocken = sTocken.substring(0,1);
			}else{
				date1.add(5,30);	//30일뒤의 날자	
			}
			
			s1MonaddDate = Integer.toString(date1.get(Calendar.YEAR)) + sTocken;
			iMonth = date1.get(Calendar.MONTH)+1;
			s1MonaddDate = s1MonaddDate + dft.format(iMonth) + sTocken;
			iDay = date1.get(Calendar.DATE);
			s1MonaddDate = s1MonaddDate + dft.format(iDay);
		
			return s1MonaddDate;
		}

	   public static String replaceInStr(String origin_txt, String	find_str, String replace_str) {
			int	itmp = 0;
			if (origin_txt==null) return "";

			String tmp = origin_txt;
			StringBuffer sb	= new StringBuffer();
			sb.append("");
			while (tmp.indexOf(find_str)>-1) {
				itmp = tmp.indexOf(find_str);
				sb.append(tmp.substring(0,itmp));
				sb.append(replace_str);
				tmp	= tmp.substring(itmp+find_str.length());
			}
			sb.append(tmp);
			return sb.toString();
		}
			   public static String Default_replice(String org_str){
		   char[] ch = {13,10};
		   org_str = replaceInStr(org_str,ch.toString(),"<br>");
		   org_str = replaceInStr(org_str,"[BR]","<br>");
		   org_str = replaceInStr(org_str,"[PC]","%");
		   org_str = replaceInStr(org_str,"[LB]","<");
		   org_str = replaceInStr(org_str,"[RB]",">");
		   org_str = replaceInStr(org_str,"[AM]","&");
		   org_str = replaceInStr(org_str,"[SQ]","'");
		   org_str = replaceInStr(org_str,"[DQ]","\"");
		   return org_str;
	   }
	   
	   public static String replaceSpecialChar(String origin_txt){ //html로 바로 출력할때
		   String txt =origin_txt;
		   txt = txt.replaceAll("\\[","")
		   			.replaceAll("\\]","")
		   			.replaceAll("BR","</br>")
		   			.replaceAll("AM","&")
		   			.replaceAll("SQ","'")
		   			.replaceAll("DQ","\"") 
		   			.replaceAll("PC","%")
		   			.replaceAll("LB","<")
		   			.replaceAll("RB","<");		   			
		   return txt;
	   }
	   
	   public static String replaceSpecialChar2(String origin_txt){	//textarea에 출력할때
		   String txt =origin_txt;
		   txt = txt.replaceAll("\\[","")
		   			.replaceAll("\\]","")
		   			.replaceAll("BR","\n")
		   			.replaceAll("AM","&")
		   			.replaceAll("SQ","'")
		   			.replaceAll("DQ","\"") 
		   			.replaceAll("PC","%");
		   return txt;
	   }
	   
	   /******************************************************************************
		 1. 메소드    이름 : makeRandomNumber
		 2. 설          명 : 난수발생
		 3. 입          력 : 난수 자릿수
		 4. 출          력 : 난수
		*******************************************************************************/
	   	public static String makeRandomNumber(int num){  //난수생성 메소드
	   		
		   int returnInt = 0;
		   String returnString="";
		   if (rd == null) rd = new Random();
	   
		  // returnInt =  rd.nextInt(num-1)+1;
		  
		   
			     int i,j;
			     for(i=0;i<num;i++){
			    	 returnInt=(int)(Math.random()*10);
 			    	 
			    	 returnString+=Integer.toString(returnInt);
			      
			     }
			     
			  
		   
		   return returnString;
		}

		 /******************************************************************************
		 1. 메소드     이름 : IsDomainReferer
		 2. 설          명 : Referer과 현재 도메인과 비교
		 3. 입          력 : Referer ,  Host 
		 4. 출          력 : True / False
		*******************************************************************************/
	   	public static boolean IsDomainReferer(String referer, String host){    
	   		referer = referer.toLowerCase().replace("http://","").replace("https://","");
	   		if (referer.indexOf("/") > 0) 	referer = referer.substring(0,referer.indexOf("/"));
	   		host = host.toLowerCase();
			return host.equals(referer);
	
		}
		 /******************************************************************************
		 1. 메소드     이름 : AlertMSG
		 2. 설          명 : javascript alert 메세지 출력
		 3. 입          력 : string 
		 4. 출          력 : 
		*******************************************************************************/
	   	public static String AlertMSG(String msg){
	   		return "<script>alert('"+ msg + "'); document.location.href='/';</script>";
	   	}
	   	public static boolean IsDate(String str){
	   	  boolean b = true;

	   	  SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd", java.util.Locale.KOREA);
	   	  //SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss",Locale.KOREA); //20041102101244
	   	  df.setLenient(false); // false 로 설정해야 엄밀한 해석을 함.

	   	  try {
	   	   Date dt = df.parse(str);
	   	  }catch(ParseException pe){
	   	   b = false;
	   	  }catch(IllegalArgumentException ae){
	   	   b = false;
	   	  }
	   	  return b;
	   	 }
	   	
} // End of Class CommonUtil

